/*********************************************************************************
 *      Copyright:  (C) 2025 LingYun<lingyun@email.com>
 *                  All rights reserved.
 *
 *       Filename:  socket_client.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(09/03/25)
 *         Author:  LingYun <lingyun@email.com>
 *      ChangeLog:  1, Release initial version on "09/03/25 20:52:07"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <getopt.h>

#define MSG_STR "Hello Lingyun IoT Studio\n"

void print_usage(char *progname)
{
	printf("%s usingage:\n", progname);
	printf("-i(--ipaddr): sepcify server IP address.\n");
	printf("-p(--port): sepcify server port.\n");
	printf("-h(--help): print this help information.\n");

	return ;
}

int main(int argc, char **argv)
{
	int						sockfd = -1;
	int 		  			rv = -1;
	struct sockaddr_in		servaddr;
	char				   *servip = NULL;
	int						port = 0;
	char					buf[1024];
	int						ch;
	struct option			opts[]={
		{"ipaddr", required_argument, NULL, 'i'},
		{"port", required_argument, NULL, 'p'},
		{"help", no_argument, NULL, 'p'},
		{NULL, 0, NULL, 0}
	};

	while( (ch = getopt_long(argc, argv, "i:p:h", opts, NULL)) !=-1 )
	{
		switch(ch)
		{
			case 'i':
				servip=optarg;
				break;
			case 'p':
				port=atoi(optarg);
				break;
			case 'h':
				return 0;
		}
	}

	if(!servip || !port)
	{
		print_usage(argv[0]);
		return 0;
	}

	sockfd=socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0)
	{
		printf("Creat socket failure: %s\n", strerror(errno));
		return -1;
	}
	printf("Craet socket[%d] successfully!\n", sockfd);

	memset(&servaddr, 0, sizeof(servaddr));

	servaddr.sin_family=AF_INET;
	servaddr.sin_port = htons(port);
	inet_aton(servip, &servaddr.sin_addr);
	rv=connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

	if(rv < 0)
	{
		printf("Connect to server[%s:%d] failure: %s\n", servip, port, strerror(errno));
		return -2;
	}
	printf("Connect to server[%s:%d] successfully!\n", servip, port);

	while(1)
	{
		rv =write(sockfd, MSG_STR, strlen(MSG_STR));

		if(rv < 0)
		{
			printf("Write to server by sockfd[%d] failure: %s\n", sockfd, strerror(errno));
			break;
		}

		memset(buf, 0, sizeof(buf));
		rv=read(sockfd, buf, sizeof(buf));
		if(rv < 0)
		{
			printf("Read data from server by socket[%d] failure: %s\n", sockfd, strerror(errno));
			break;
		}
		else if(rv == 0)
		{
			printf("Socket[%d] get disconnected\n", sockfd);
			break;
		}
		else if(rv > 0)
		{
			printf("Read %d data from Server: %s\n", rv, buf);
		}
	}

	close(sockfd);
}

